/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import java.sql.*;
import java.util.Properties;

/**
 *
 * @author NhatHuy
 */
public class MySQLDataAccessHelper {
    private Connection con;
    
    /**
     * Phương thức mở kết nối đến csdl.
     */
    public void open(){
        try {
            //Đăng ký driver.
            Driver d = new org.gjt.mm.mysql.Driver();
            DriverManager.registerDriver(d);
            String url = "jdbc:mysql://localhost/shoesonline";
            Properties info = new Properties();
            info.setProperty("characterEncoding", "utf-8");
            info.setProperty("user", "root");
            this.con = DriverManager.getConnection(url, info);
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }
    
    /**
     * Phương thức đóng kết nối csdl.
     * 
     */
    public void close(){
        try {
            this.con.close();
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }
    
    /**
     * Phương thức thực thi một câu lệnh sql lấy dữ liệu
     * @param sql String: câu lệnh sql
     * @return ResultSet
     */
    public ResultSet executeQuery(String sql){
        ResultSet rs = null;
        try {
            Statement state = this.con.createStatement();
            rs = state.executeQuery(sql);
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
        return rs;
    }
    
    /**
     * Phương thức thực thi một câu lệnh sql cập nhật dữ liệu.
     * @param sql String: câu lệnh sql.
     * @return (1) 0: cập nhật thất bại, (2) khác 0: cập nhật thành công.
     */
    public int executeUpdate(String sql){
        int n = 0;
        try {
            Statement state = this.con.createStatement();
            n = state.executeUpdate(sql);
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
        return n;
    }
    
    /**
     * Phương thức thực thi một Store Procedure.
     * @param strCallStoreProcedure String: chuỗi gọi Store Procedure.
     * Ví dụ: {call tenStoreProcedure(thamso1,thamso2,...)}
     * @return ResultSet.
     */
    public ResultSet executeStoreProcedureGetResultSet(String strCallStoreProcedure){
        ResultSet rs = null;
        try {
            CallableStatement statement = this.con.prepareCall(strCallStoreProcedure);
            statement.execute();
            rs = statement.getResultSet(); 
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
        return rs;
    }
    
    /**
     * Phương thức thực thi một Store Procedure.
     * @param strCallStoreProcedure String: chuỗi gọi Store Procedure.
     * Ví dụ: {call tenStoreProcedure(thamso1,thamso2,...)}
     * @return n: (0)-cập nhật thất bại, (khác 0)-cập nhật thành công.
     */
    public int executeStoreProcedureGetUpdateCount(String strCallStoreProcedure){
        int n = 0;
        try {
            CallableStatement statement = this.con.prepareCall(strCallStoreProcedure);
            statement.execute();
            n = statement.getUpdateCount();
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
        return n;
    }
    
    /**
     * Phương thức cài đặt AutoCommit Transaction.
     * @param auto boolean: (true) Auto commit; (false) Not Auto commit.
     */
    public void setAutoCommit(boolean auto){
        try {
            this.con.setAutoCommit(auto);
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }
    
    /**
     * Phương thức commit.
     */
    public void commit(){
        try {
            this.con.commit();
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }  
    
    /**
     * Phương thức rollback.
     */
    public void rollback(){
        try {
            this.con.rollback();
        } catch (SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }      
}
